package com.shujiaotong.controller;



import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.shujiaotong.common.R;
import com.shujiaotong.common.RegexUtils;
import com.shujiaotong.common.SMSSendCode;
import com.shujiaotong.pojo.*;
import com.shujiaotong.service.IUserService;
import com.shujiaotong.utils.CodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;


/**
 * <strong>
 *  前端控制器
 * </strong>
 *
 * @author author
 * @since 2024-10-20
 */
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private IUserService userService;

//    分页
    @GetMapping("page")
    public R page(
            @RequestParam int page,
            @RequestParam int pageSize,
            @RequestParam(required = false) String name,
            @RequestParam String type
            ){
        //        接收参数
        log.info("当前页:{},页条数:{},姓名:{},分类:{}",page,pageSize,name,type);
        //        分页条件
        Page<User> userPage = new Page<>(page, pageSize);
        //        查询条件,根据type查询

        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
        if (type.equals("老师")){
            qw.eq(User::getType,"老师");
        }else if (type.equals("会员")){
            qw.eq(User::getType,"会员");
        }
        qw.like(!StringUtils.isEmpty(name),User::getName,name);
        //        分页查询
        userService.page(userPage,qw);
        //        返回值
        return R.success(userPage);
    }

//    新增老师,json格式
    @PostMapping("teacher")
    public R addTeacher(@RequestBody User user) {
        user.setType("老师");
        user.setUpdateTime(LocalDateTime.now());
        boolean b = userService.save(user);
        return b?R.success("新增成功"):R.error("新增失败");
    }

//    根据id查询老师
    @GetMapping("/teacher/{id}")
    public R getTeacherById(@PathVariable Long id){
        User byId = userService.getById(id);
        return R.success(byId);
    }
//    修改老师
    @PutMapping("teacher")
    public R update(@RequestBody User user){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.eq(User::getId,user.getId());

        boolean update = userService.update(user, lqw);
        return update?R.success("修改成功"):R.error("修改失败");
    }

//    查询所有老师
    @GetMapping("teacher")
    public R listTeacher(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.eq(User::getType,"老师");
        return R.success(userService.list(lqw));
    }
//    查询所有学生
    @GetMapping("student")
    public R listStudent(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.eq(User::getType,"会员");
        return R.success(userService.list(lqw));
    }

//    修改状态（禁用启用）status
    @PutMapping("status")
    public R changeStatus(@RequestBody User user) {
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.eq(User::getId,user.getId());
        user.setUpdateTime(LocalDateTime.now());
        return userService.update(user,lqw)?R.success("修改成功"):R.error("修改失败");
    }

//    根据id查询会员（user）
    @GetMapping("/user/{id}")
    public R getUserById(@PathVariable Long id){
        User byId = userService.getById(id);
        return R.success(byId);
    }

//    新增会员
    @PostMapping("user")
    public R saveUser(@RequestBody User user) {
        user.setType("会员");
        user.setUpdateTime(LocalDateTime.now());
        return userService.save(user)?R.success("新增成功"):R.error("新增失败");
    }

//    修改会员
    @PutMapping("/student")
    public R updateStudent(@RequestBody User user){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.eq(User::getId,user.getId());
        boolean update = userService.update(user, lqw);
        return update?R.success("修改成功"):R.error("修改失败");
    }

    // 根据用户id 获取卡片信息
    @GetMapping("userCards/{userid}")
    public R getUserCardsByUserid(@PathVariable Long userid){
        log.info("根据用户id 获取卡片信息userId：{}",userid);

        List<UserCard> list = userService.getUserCardsByUserid(userid);

        return R.success(list);
    }

//    为会员办卡
    @PostMapping("/user/saveByCardId/{cardId}")
    public R saveByCardIdToUser(@PathVariable Long cardId,
                                @RequestBody User user){
        log.info("给用户办卡:cardID:{},user:{}",cardId,user);

        boolean b = userService.saveByCardIdToUser(cardId,user);

        return b?R.success("操作成功"):R.error("操作失败");
    }

    // 根据用户ID 查询用户课程
    @GetMapping("/userClasses/{userId}")
    public R userClasses(@PathVariable Long userId){
        log.info("根据用户ID 查询用户课程userId：{}",userId);
        List<Classes> list = userService.userClassesByUserId(userId);
        return  R.success(list);
    }

//    查询该老师的课程
    @GetMapping("teacher/classes/{id}")
    public R teacherClasses(@PathVariable Long id){
        return userService.getUserByClassId(id);
    }
    @Autowired
    private RedisTemplate redisTemplate;
//    发送验证码
    @PostMapping("sendMsg")
    public R sendMessage(@RequestBody Map<String,String> map){
        //1. 接收手机号
        String phone = map.get("phone");
        //2. 校验手机号格式
        if(!RegexUtils.isPhoneNumber(phone)){
            return R.error("手机号格式输入错误");
        }
        //3. 生成验证码
        Integer code = CodeUtils.generateValidateCode(4);
        log.info("code:{}",code);
        //4. 验证码存入redis
        redisTemplate.opsForValue().set(
                "code"+phone,
                code,
                5,
                TimeUnit.MINUTES
        );
//        log.info("验证码:{}",code);
        //5. 给用户发短信
//    try {
//      SMSSendCode.sendCode(phone,String.valueOf(code));
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
        //返回
        return R.success("验证码发送成功"+code);
    }

//    小程序登录，json格式，phone、code、type
//    用户登录
@PostMapping("login")
public R login(@RequestBody Map<String,String> map){
    // 1. 接收手机号 - 验证
    String phone = map.get("phone");
    //2. 校验手机号格式
    if(!RegexUtils.isPhoneNumber(phone)){
        return R.error("手机号格式输入错误");
    }
    // 2. 接收验证码 - 校验 redis 中验证码比较
    String code = map.get("code");// 用户输入的验证码
    if(StringUtils.isEmpty(code)){
        return R.error("请输入验证码");
    }
    // redis 获取的
    Object _code = redisTemplate.opsForValue().get("code" + phone);
    if(StringUtils.isEmpty(_code)){
        return R.error("验证码已过期");
    }
    if(!String.valueOf(_code).equals(code)){
        return R.error("验证码输入错误");
    }
    // 3. 类型非空判断
    String type = map.get("type");
    if(StringUtils.isEmpty(type)){
        return R.error("类型不能为空");
    }
    // 4. 查询用户详细信息
    LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
    qw.eq(User::getPhone,phone);
    qw.eq(User::getType,type);
    User user = userService.getOne(qw);

    // 用户查不到 - 会员 - 注册
    if(user == null && type.equals("会员")){
        user = new User();
        user.setName("_会员_"+phone);
        user.setPhone(phone);
        user.setBirthday(LocalDate.now());
        user.setImage("1726842775246.jpg");
        user.setStatus(1);
        user.setType("会员");
        user.setUpdateTime(LocalDateTime.now());
        user.setCreateTime(LocalDateTime.now());
        user.setCreateUser(2L);// 2号为用户自己注册
        user.setUpdateUser(2L);
        userService.save(user);//ID 回显
        // 用户查不到 - 老师 - 管理员介入
    }else if(user == null && type.equals("老师")){
        return R.error("老师未注册，请联系管理员");
    }

    // 用户禁用判断
    if(user.getStatus() == 0){
        return R.error("用户已被禁用");
    }
    // 登录 - 用户ID 存入redis
    redisTemplate.opsForValue().set(
            "auth"+user.getId(),
            user.getId(),
            30,
            TimeUnit.MINUTES
    );
//    返回用户信息
    return R.success(user);
    }

//    查询老师,分页
    @GetMapping("teacher/page")
    public R teacherPage(@RequestParam int page,
                         @RequestParam int pageSize,
                         @RequestParam(required = false) String name){
//        接收参数
        log.info("当前页:{},页条数:{},姓名:{},分类:{}",page,pageSize,name);
        //        分页条件
        Page<User> userPage = new Page<>(page, pageSize);
        //        查询条件,根据type查询

        LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
        qw.like(!StringUtils.isEmpty(name),User::getName,name);
        qw.eq(User::getType,"老师");
        //        分页查询
        userService.page(userPage,qw);
        //        返回值
        return R.success(userPage);
    }

    // 根据用户ID和卡片ID 查询此人是否有这个卡
    @GetMapping("/getSelectedCard")
    public R getSelectedCard(@RequestParam Long userId,
                             @RequestParam Long cardId){
        log.info("根据用户ID和卡片ID 查询此人是否有这个卡:userId{},cardId{}",userId,cardId);

        boolean b = userService.getSelectedCard(userId,cardId);
        return R.success(b);
    }

//    小程序修改个人信息
    @PutMapping("/user")
    public R updateUser(@RequestBody User user){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.eq(User::getId,user.getId());
        boolean update = userService.update(user, lqw);
        return update?R.success("修改成功"):R.error("修改失败");
    }
}
